
first(VT) = VT;
while (first集发生了变化)
{
    对于每一个产生式A->BCD... if (B是非终结符)
    {
        将B加入到first(A);
    }
    else if (B是非终结符)
    {
        将first(B) 中的非空元素加入first(A);
        if (first(B) 中有空子)
        {
            将first(C) 的非空元素加入到first(A);
            处理下一个字符D;
        }
        if (当前非终结符为产生式末尾的非终结符，且first集中包含空字)
        {
            将空字添加到first(A);
        }
    }
}

while (follow集发生了变化)
{
    对于每一个产生式A->BCD... 
    对于产生式中的每一个非终结符
    {
        if (产生式形如A->aB)
            follow(B) 添加follow(A);
        else if (产生式形如A->aBb)
        {
            follow(B) 添加first(b) 中的非空元素 if (first(b) 中包含空字，且由空字进行到末尾)
            {
                follow(b) 添加follow(A);
            }
            else if (尚未进行到末尾)
            {
                加入当前first;
            }
        }
    }
}

对于每一个产生式A->BCD...
{
    if (A->空字)
    {
        对于follow(A) 中的每一个终结符b，
        将A->空字，放入预测表M[A, b];
    }
    else if (A->a)
    {
        对于first(a) 中的非空元素b,
        将A->a，放入M[A, b];
        if(first(a)中包含空字)
        {
            对于follow(A) 中的每一个终结符b，
            将A->空字，放入预测表M[A, b];
        }
    }
}

设置ip使他指向w的第一个符号，ip是输入指针;
令X=栈顶符号;
if(X!=$)
{
    if(X等于ip所指向的符号a)
    {
        执行弹出操作，将ip向前移动一个位置;
    }
    else if (X是一个非终结符号) error();
    else if (M[X,a]是一个报错条目) error();
    else if (M[X,a]=X->Y1Y2...Yk)
    {
        输出产生式X->Y1Y2...Yk;
        弹出栈顶符号;
        将Yk...Y2Y1压入栈中，其中Y1位于栈顶;
    }
    令X=栈顶符号;
}

语义实现()
{
    语法分析();
    {
        当前使用的产生式A->BCD...;
        前序遍历BCD...;
        产生式对应语义规则实现;
    }
}